package com.lpf.example.example04.sever;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;

import java.util.concurrent.TimeUnit;

public class MyServerInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {

        ChannelPipeline pipeline = ch.pipeline();

        /**
         * 空闲检测：IdleStateHandler  处理读空闲、写空闲、读写空闲 （多长时间没有读写，处理些事情）
         * 应用到心跳检测，如：两台机器建立连接后，网断了，C和S都感知不到断网，因此，有一方经过一段时间，发心跳包，
         * 对方收到后证明连接在，若在事先约定的时间内没收到，则连接断，close之前连接，重连
         */

        /**
         * 这些Handler就像过滤器或拦截器一样，在设计模式中被称为责任链模式。
         * IdleStateHandler：空闲状态监测的处理器。当 channel 在一段时间内没有进行 read、write 等操作会触发IdleStateEvent事件。
         *
         * readerIdleTime：服务端在一段时间内没有读取任何数据。
         * writerIdleTime：服务端在一段时间内没有向客户端写任何数据。
         * allIdleTime：服务端在一段时间内没有检查到读也没有检查到写。
         */
        pipeline.addLast(new IdleStateHandler(5,7,10, TimeUnit.SECONDS));
        pipeline.addLast(new MyServerHandler());
    }
}
